home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / amos / am_mui10.lha / MUI / MUI-DEMO.AMOS / MUI-DEMO.amosSourceCode < prev    next >
AMOS Source Code  |  1992-02-26  |  44KB  |  1,349 lines

  1. '***************************************************************************** 
  2. '**         AMOS MUI Demo V1.0 - By Paul Hickman (ph@doc.ic.ac.uk)          **   
  3. '**         ==================   =================================          ** 
  4. '** This file is both a demonstraction, and an application template. Read   ** 
  5. '** the comments on how & where to modify it.                               ** 
  6. '**                                                                         ** 
  7. '**    At least MUI V2.1 (muimaster.library V8) is required, and KS2.04+    ** 
  8. '**                                                                         ** 
  9. '** MUI V2.1 is available on aminet as /dev/gui/mui21usr.lha. You should    ** 
  10. '** also get /dev/gui/mui21dev.lha to get the programers documentation &    ** 
  11. '** autodocs. You do not need the rest of the developers archive, apart     ** 
  12. '** from maybe the demo programs sources to look at examples of objects.    ** 
  13. '**                                                                         ** 
  14. '** This freeware. It may be freely distributed / modified as long as no    ** 
  15. '** profit is made, except as part of a shareware program, where you may    ** 
  16. '** use it if you send me a registered copy.                                ** 
  17. '**                                                                         ** 
  18. '** Please send me any MUIB macro procedures you write that may be usefull, ** 
  19. '** other improvements, ideas, and bug reports.                             ** 
  20. '***************************************************************************** 
  21.  
  22. 'Rev 19
  23. '
  24. 'NOTE: If you break an MUI program, or an error occurs, you should go to 
  25. 'direct mode and type  Areg(0)=APP_Obj : A=LibCall(2,-$24)  immediately  
  26. 'to remove the MUI windows & commodities brokers.
  27. '
  28. '
  29. 'NOTE: The symbolic names for MUI's constants have been taken from the MUI.I 
  30. '      assembler include file, and in a few cases differ slightly from the 
  31. '      C MUI.h file. 
  32. '
  33. '
  34. 'Bank Usage
  35. '==========
  36. '
  37. '
  38. '13 - Symbol Table Weight Balenced (Almost) Binary Tree for MUI & ASL taglists 
  39. '14 - Generic Hook Code that calls _USER_RETURN_ID 
  40. '17 - MUI Permanent Workspace
  41. '18 - MUI Temporary Workspace
  42. '
  43. '32 - Special Hook Code for LISTSTRING objects 
  44. '
  45.  
  46. Set Buffer 20
  47. '
  48. '
  49. '********************  
  50. '** Debugging Mode **
  51. '********************
  52. '
  53. 'Since if errors occur in your initial objects taglists, you may have some 
  54. 'objects already allocated, run with _DEBUG=1 initially, until you get the 
  55. 'message 'Application Tested OK', then switch _DEBUG=0 to run for real. When 
  56. '_DEBUG=1, the no objects are actually created, so if something goes wrong,  
  57. 'you don't have to manually dispose of anything. 
  58.  
  59. _DEBUG=0
  60. '
  61. '****************************************************************************
  62. 'For Users of andrew chruches Intuition Extension, you can put MUI windows 
  63. 'on an AMOS Intuition screen - uncomment this line, and those in the window
  64. 'definitions, and the Iscreen Close at the end.
  65. '
  66. 'Iscreen Open 0,640,256,2,Hires,"MUI Demo Screen"
  67. '
  68.  
  69. '
  70. '
  71. 'MUI Initialisation  
  72. '==================
  73. '
  74. 'Parameter 1 is size of bank 17 which is reserved for string gadget text,  
  75. 'hook data structures, etc. You can find out how much has been used at 
  76. 'any time by examining the value of MUI_WORK_PTR which points to it's end
  77. '
  78. 'Parameter 2 is size of bank 18 which is used to store a taglist temporary 
  79. 'literal strings.
  80. '
  81. _MUI_INIT[10000,2000]
  82.  
  83. 'MUI Macros
  84. '==========
  85. '
  86. 'I Have not yet converted all MUI macros. Some simple ones appear here,
  87. 'others occur as procedures below. 
  88.  
  89.  
  90. Def Fn ADR$(A)="("+ Extension_16_04CE(A)+"),"
  91. Def Fn MUI_CHILD$(OBJ)="MUIA_Group_Child,"+ Fn ADR$(OBJ)
  92. Def Fn MUI_WIN_CONTENT$(OBJ)="MUIA_Window_RootObject,"+ Fn ADR$(OBJ)
  93. Def Fn MUI_APP_WINDOW$(OBJ)="MUIA_Application_Window,"+ Fn ADR$(OBJ)
  94.  
  95.  
  96. '****************************************************************************
  97. 'Insert initialisation of your programs arrays & variables here. 
  98.  
  99.  
  100. '****************************************************************************
  101. 'This part of the program creates the MUI Application interface. 
  102. '=============================================================== 
  103.  
  104. 'Unlike most languages where you can create the application in one massive 
  105. 'function call, in AMOS, you have to do it object by object from the bottom
  106. 'up - I.E. Before creating an object, you must have first created all of its 
  107. 'children. (Children = Sub Objects / Other Objects which it contains a pointer 
  108. 'to) 
  109.  
  110. 'NOTE: To ensure correct deallocation of memory, you should create each
  111. '      object, and totally ignore the return value. When you create an object  
  112. '      if you set any of its children to 0 in the taglist, that object 
  113. '      fails, and in doing so, disposes of any of its non-NULL children. When  
  114. '      you create the application object, look at APP_OBJ. If it is 0, one of
  115. '      your objects failed to create, but everything else has been deallocated 
  116. '      from memory. Do not stop as soon as you find a NULL return value. 
  117.  
  118. 'NOTE: Always call you application object APP_OBJ for consistancy. 
  119.  
  120.  
  121. 'AMOS Taglist Format 
  122. '=================== 
  123. '
  124. 'What is a taglist?
  125. '------------------
  126. '
  127. 'A Taglist is an set of consecutive pairs of longwords of memory, terminated 
  128. 'by a NULL longword e.g. 
  129. '  
  130. '   Ellong$(TAG1)+Ellong$(DATA1)+elong$(TAG2)+elong$(DATA2)+elong$(0)  
  131. '
  132. 'The first longword of each pair is called the 'Tag' and is usually a
  133. 'constant value from an include/header file (An equate in AMOS), which 
  134. 'describes the attribute you wish to set. The 'Data' longword is the 
  135. 'value you wish to set that attribute to. So if the AMOS Screen Open 
  136. 'command took a taglist, it might be something like: 
  137. '
  138. 'Screen Open Ellong$(SCR_NUMBER)+Ellong$(0)
  139. '           +Ellong$(SCR_WIDTH)+Ellong$(320) 
  140. '           +Ellong$(SCR_HEIGHT)+Ellong$(200)
  141. '           +Ellong$(SCR_MODE)+Ellong$(SCR_MODE_LOWRES)
  142. '           +Ellong$(SCR_COLOURS)+Ellong$(16)
  143. '           +Ellong$(0)
  144. '
  145. 'The variables are the 'tag' constants. The tags are used so that the
  146. 'parameter can be given in any order, and some can be left out. Any that 
  147. 'are left out are given default values.
  148. '
  149. '
  150. 'How does MUI use taglists?
  151. '==========================
  152. '
  153. 'MUI uses taglists to describe the intial attributes of the object which 
  154. 'make up your interface, and to change these attributes. It also uses them 
  155. 'in the _DO_METHOD function, but breaks the rules slightly here, as the
  156. 'tags aren't in pairs, and order is important. 
  157. '
  158. '
  159. 'How do I make using taglists from AMOS Easier?
  160. '==============================================
  161. '
  162. 'The taglist should be placed in an AMOS string, with each item seperated
  163. 'by commas. Elements can be: 
  164. '
  165. '
  166. ' - Decimal Numbers
  167. '
  168. ' - Hex Numbers
  169. '
  170. ' - Symbolic Names (Equates) from the assembler MUI.I file 
  171. '
  172. ' - Literal Strings, by placing them in single quotes. These strings 
  173. '   as temporary, suitable for MUI_Text_Contents & Listview elements.
  174. '   They are overwritten by the next taglist's strings.
  175. '
  176. ' - Permanent Literal Strings, by begining the quotes with a backward single 
  177. '    quotes (` = Alt-'). These strings as copied into the MUI Workspace bank.
  178. '   E.g. "MUIA_Window_Title,`The Window'"
  179. '
  180. ' - Longwords, by placing them in parenthesis (). These are longwords
  181. '   generated from integers with the Ellong$() function. Use for object
  182. '   addresses / values in AMOS integer variables, via the ADDR$ macro  
  183. '
  184. '
  185. 'Literal Strings may contain (This may change in new versions):
  186. '
  187. ' \n = Newline 
  188. ' \a = ' 
  189. ' \b = ` 
  190. ' \q = " 
  191. ' \t = Tab 
  192. ' \e = Escape
  193. ' \\ = \ 
  194. '
  195. 'See Mui Autodoc for for Text.mui for details of MUI text formatting strings 
  196. '
  197. 'Pass these taglists to _COMPILE, and a relocatable form of the taglist
  198. 'will be returned in Param$. This string could be saved in a bank, or
  199. 'wherever to remove the need for compiling it every time the program is
  200. 'run.
  201. '
  202. '
  203. 'General Use Of Strings
  204. '======================
  205. '
  206. '
  207. ' If a string is to be displayed as text by MUI (E.g. Listviews, Labels, 
  208. ' buttons, etc.) it is safe to make it a temporary string. If it is to 
  209. ' be displayed by intuiton (E.g. Window Titles), make it permanent.
  210. '
  211. ' There is no need to append chr$(0) to the end of your strings - my 
  212. ' procedure do this when necessary.
  213. '
  214. ' If you manual include a pointer to a string in a taglist, make sure
  215. ' that address will remain constant until the taglist is used, and if
  216. ' the string is not copied my MUI, and needs to be permanent, make sure
  217. ' the address does not change until the object is disposed of. This means
  218. ' do not use Varptr(...$) as the AMOS garbage collector may move it. 
  219. '
  220. '
  221. 'Passing taglists to my MUI procedures 
  222. '===================================== 
  223. '
  224. 'The _COMPILE procedure replaces the symbolic names & hex/decimal integers 
  225. 'with longwords, and moves the literal strings together at the end of the
  226. 'string. It stores offset information about the literal strings at the very
  227. 'end of the taglist. 
  228. '
  229. 'When you pass a taglist to a procedure, the address of the strings is 
  230. 'computed, and inserted into the list, which is then passed to MUI. Also 
  231. 'permanent strings are stored in bank 17 
  232. '
  233. 'You may also pass any function which expects a taglist a real raw taglist 
  234. 'string (Array of longwords), on the condition that it does not end with 
  235. 'the longword $80000000, as this is how compiled taglist are identified. 
  236. 'If your raw taglist does end in $80000000, just add an Ellong$(0) to the
  237. 'end - this should not cause any problems. 
  238.  
  239.  
  240.  
  241.  
  242. '****************************************************************************
  243. 'Creation of the demo application. 
  244.  
  245. '******* Creation of sounds window 
  246. '
  247. 'Create the sound / close button objects 
  248. '
  249. _MUIB_KEYBUTTON["Quit","q"] : BUT_QUIT_OBJ=Param
  250. _MUIB_KEYBUTTON["Bell","b"] : BUT_BELL_OBJ=Param
  251. _MUIB_KEYBUTTON["Gun","g"] : BUT_SHOOT_OBJ=Param
  252. _MUIB_KEYBUTTON["Explosion","e"] : BUT_BOOM_OBJ=Param
  253.  
  254. 'Create the horizontal group for the buttons 
  255. '
  256. _MUIB_GROUP[ Extension_16_04CE(BUT_BELL_OBJ)+ Extension_16_04CE(BUT_SHOOT_OBJ)+ Extension_16_04CE(BUT_BOOM_OBJ)+ Extension_16_04CE(BUT_QUIT_OBJ),1,0]
  257. GRP2_OBJ=Param
  258.  
  259. 'Create the title label boxes
  260. '
  261. _MUIB_TITLE_LABEL["Some MUI Gadgets"] : LAB_GAD_OBJ=Param
  262. _MUIB_TITLE_LABEL["AMOS Sound Effects"] : LAB_SOUND_OBJ=Param
  263.  
  264.  
  265. 'Create the string gadget
  266. '
  267. _MUIB_FILESTRING["File:","f","Filename","Select Filename"] : FILE_OBJ=Param
  268.  
  269.  
  270. 'Create the popinglist-string gadget 
  271. '
  272. _MUIB_LISTVIEW["Excellent|Super|Advanced|Default|Average|Crap|Useless|IBM"] : PLIST_OBJ=Param
  273. _MUIB_LISTSTRING["Default",32,"c","Class:",PLIST_OBJ] : PLS_OBJ=Param
  274.  
  275.  
  276. 'Create the cycle gadget 
  277. '
  278. _MUIB_CYCLE["This|Is|A|Cycle|Gadget"] : CYC_OBJ=Param
  279.  
  280.  
  281. 'Create the listview gadget
  282. '
  283. _MUIB_LISTVIEW["This|Is A|Simple|Listview|Gadget"] : LIST_OBJ=Param
  284.  
  285.  
  286. 'Create the bitmap from bob image. 
  287. '
  288. _MUIB_BITMAP_BOB[1,"MUIV_FrameGroup"] : BIT_OBJ=Param
  289.  
  290.  
  291. 'Create the checkmark object 
  292. '
  293. '
  294. _MUIB_CHECKMARK["Checkmark","m",0] : CHK_OBJ=Param
  295.  
  296.  
  297. 'Put the bitmap, checkmark & cycle in a group. 
  298. '
  299. _MUIB_GROUP[ Extension_16_04CE(CYC_OBJ)+ Extension_16_04CE(CHK_OBJ),0,1]
  300. GRP3_OBJ=Param
  301.  
  302. _MUIB_GROUP[ Extension_16_04CE(BIT_OBJ)+ Extension_16_04CE(GRP3_OBJ),1,0]
  303. GRP4_OBJ=Param
  304.  
  305.  
  306. 'Create the windows main group 
  307. '
  308. _MUIB_GROUP[ Extension_16_04CE(LAB_GAD_OBJ)+ Extension_16_04CE(GRP4_OBJ)+ Extension_16_04CE(LIST_OBJ)+ Extension_16_04CE(FILE_OBJ)+ Extension_16_04CE(PLS_OBJ)+ Extension_16_04CE(LAB_SOUND_OBJ)+ Extension_16_04CE(GRP2_OBJ),0,0]
  309. GRP1_OBJ=Param
  310. '
  311.  
  312.  
  313. 'Create the window object
  314. '
  315. WIN$="MUIA_Window_Title,`MUI-AMOS Test Window',"
  316. '
  317. 'Uncomment to put window on AMOS Intuition screen if you have that extension 
  318. 'WIN$=WIN$+"MUIA_Window_Screen,"+ Fn ADR$( Iscreen Base )  
  319. WIN$=WIN$+ Fn MUI_WIN_CONTENT$(GRP1_OBJ)+"TAG_DONE"
  320. _COMPILE[WIN$]
  321. _MUI_NEW_OBJECT["Window.mui",Param$] : WIN_OBJ=Param
  322.  
  323.  
  324.  
  325.  
  326.  
  327. '********** Create the application object
  328. '
  329. 'NOTE: All windows are children of the application object, but do not appear 
  330. '      until the window open attribute is set. 
  331. '
  332. 'NOTE: The strings below appear in commodities exchange & CLI version command
  333. '      and should always be set. 
  334. '
  335. APP$="MUIA_Application_Author,'Paul Hickman',"
  336. APP$=APP$+"MUIA_Application_Base,'AMOS-MUI',"
  337. APP$=APP$+"MUIA_Application_Title,'AMOS MUI Demo',"
  338. APP$=APP$+"MUIA_Application_Version,'$VER: AMOS MUI Demo 1.0 (12.08.94)',"
  339. APP$=APP$+"MUIA_Application_Copyright,'Paul Hickman 1994.',"
  340. APP$=APP$+"MUIA_Application_Description,'Example on how to use MUI from AMOS',"
  341. APP$=APP$+ Fn MUI_APP_WINDOW$(WIN_OBJ)+"TAG_DONE"
  342. _COMPILE[APP$]
  343. _MUI_NEW_OBJECT["Application.mui",Param$] : APP_OBJ=Param
  344.  
  345. If APP_OBJ=0
  346.    'Insert your emergency abort code here 
  347.    
  348.    If _DEBUG=1
  349.       Print "Application Tested OK."
  350.    Else 
  351.       Print "Failed to create application."
  352.    End If 
  353.    _MUI_CLOSE
  354.    End 
  355. Else 
  356.    Print "Application Created."
  357. End If 
  358.  
  359. '****************************************************************************
  360. 'This part of the program initialises the methods. These are strings that
  361. 'say "Whenever this happens to object A, make this happen to object B", or 
  362. '"Whenever this happens to object A, call the _USER_RETURNID procedure with
  363. 'this parameter. 
  364. '
  365. '
  366. 'NOTE: These methods can be initialised anytime after the objects they 
  367. '      concern are created. Only those concerning APP_OBJ must wait until  
  368. '      now. It is in fact better to put them before the APP_OBJ creation 
  369. '      if possible so you can test them with _DEBUG=1. 
  370. '
  371. '
  372. 'Setup the window close button to quit the program 
  373. '
  374. 'Parameters of taglist are:  
  375. '
  376. 'MUIM_Notify - Says this is a notification method. Always 1st. 
  377. 'MUIA_Window_CloseRequest  -  Attribute of object to watch for changes.
  378. '1 - Value to what for MUIA_Window_CloseRequest to change 1 (1=True in MUI)
  379. 'APP_OBJ - Object to send message to when MUIA_Window_Close request becomes 1
  380. '2 - Number of parameters in the message 
  381. '
  382. 'Then the message that is send to APP_OBJ: 
  383. '
  384. 'MUIM_Application_ReturnID - This is a return value to AMOS Method 
  385. 'MUIV_Application_ReturnID_Quit - The ID code number to return is quit (-1)
  386. '
  387. 'MUIV_Application_ReturnID_Quit is a special paramter, which instead of
  388. 'being passed to _USER_RETURN_ID like every other value causes the mainloop
  389. 'to exit, which means the application is quit. 
  390. '
  391. _COMPILE["MUIM_Notify,MUIA_Window_CloseRequest,1,"+ Fn ADR$(APP_OBJ)+"2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit"]
  392. '
  393. 'The taglist above is sent to WIN_OBJ, as it is this objects close button
  394. 'we wish to monitor. 
  395. '
  396. _MUI_DO_METHOD[WIN_OBJ,Param$]
  397.  
  398.  
  399. 'Setup the quit button to also quit the program
  400.  
  401. 'The general format for these notifies is: 
  402. '
  403. 'MUIM_Notify, ATTRIBUTE, VALUE, SENDTO, NOPARAMS.  
  404. '
  405. 'I.E. Whenever the ATTRIBUTE specified of the object passed in _MUI_DO_METHODA 
  406. '     changes to the VALUE specified , send the message in the rest of the list
  407. '     to the object in the SENDTO argument. NOPARAMS is the number of
  408. '     parameters in the rest of the list (The message).
  409. '
  410. '
  411. '
  412. _COMPILE["MUIM_Notify,MUIA_Pressed,0,"+ Fn ADR$(APP_OBJ)+"2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit"]
  413. _MUI_DO_METHOD[BUT_QUIT_OBJ,Param$]
  414.  
  415. '
  416. 'Setup the 3 sound buttons to return values to _USER_RETURN_ID 
  417. '
  418.  
  419. _COMPILE["MUIM_Notify,MUIA_Pressed,0,"+ Fn ADR$(APP_OBJ)+"2,MUIM_Application_ReturnID,1"]
  420. _MUI_DO_METHOD[BUT_BELL_OBJ,Param$]
  421. _COMPILE["MUIM_Notify,MUIA_Pressed,0,"+ Fn ADR$(APP_OBJ)+"2,MUIM_Application_ReturnID,2"]
  422. _MUI_DO_METHOD[BUT_SHOOT_OBJ,Param$]
  423. _COMPILE["MUIM_Notify,MUIA_Pressed,0,"+ Fn ADR$(APP_OBJ)+"2,MUIM_Application_ReturnID,3"]
  424. _MUI_DO_METHOD[BUT_BOOM_OBJ,Param$]
  425.  
  426. '
  427. 'Setup return in the string gadget to return 4 to _USED_RETURN_ID
  428. '
  429. 'NOTE: Use of MUIV_EveryTime for the value.
  430. '
  431. _COMPILE["MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,"+ Fn ADR$(APP_OBJ)+"2,MUIM_Application_ReturnID,4"]
  432. _MUI_DO_METHOD[FILE_OBJ,Param$]
  433.  
  434. 'Now setup the order of tab-cycling for that gadgets 
  435. _COMPILE["MUIM_Window_SetCycleChain,"+ Fn ADR$(CYC_OBJ)+ Fn ADR$(CHK_OBJ)+ Fn ADR$(LIST_OBJ)+ Fn ADR$(FILE_OBJ)+ Fn ADR$(BUT_BELL_OBJ)+ Fn ADR$(BUT_SHOOT_OBJ)+ Fn ADR$(BUT_BOOM_OBJ)+ Fn ADR$(BUT_QUIT_OBJ)+"0"]
  436. _MUI_DO_METHOD[WIN_OBJ,Param$]
  437.  
  438.  
  439. '****************************************************************************
  440. 'This is the main part of the almost any MUI Program.  
  441.  
  442. Fill Start(18) To Start(18)+Length(18),0 : Rem ensure all temporary strings are erased so you can see mistakes! 
  443.  
  444. 'Open the window 
  445. '
  446. _MUI_SET_ATTRS[WIN_OBJ,"MUIA_Window_Open",1]
  447.  
  448.  
  449. 'Wait for user to quit. NOTE: Amiga-A is disabled because we are waiting 
  450. 'on signals alot of the time - I.E. The AMOS process is suspended, and if
  451. 'the MUI screen is not accessable, the signals may never be sent, as they may
  452. 'come from user inputs, so you machine hangs!. 
  453.  
  454.  
  455. Bell 
  456. Print "Press A Key To Begin..."
  457. Wait Key 
  458. Amos Lock 
  459. Amos To Back 
  460. _MUI_MAIN_LOOP[APP_OBJ]
  461. Amos To Front 
  462. Amos Unlock 
  463.  
  464.  
  465.  
  466. 'Close the application. This gets rid off all objects, as long as they 
  467. 'are children of the APP_OBJ. If they are other objects in existance,
  468. 'dispose of them here also.  
  469. '
  470.  
  471. 'NOTE: You APP_OBJ must be called APP_OBJ as it is a shared variable 
  472.  
  473. _MUI_CLOSE
  474.  
  475. '****************************************************************************
  476. 'Insert your programs termination tidy-up code here. 
  477. '
  478. '
  479. 'for Intuiton extension users only...
  480. 'Iscreen Close 0 
  481. End 
  482.  
  483.  
  484.  
  485. '****************************************************************************
  486. '** Below is the MUI interface procedures. Open each to see what its for.  **
  487. '** These procedures do not require changing for other programs, except for**
  488. '** _USER_RETURN_ID which needs re-coding each time.                       **
  489. '****************************************************************************
  490. '
  491. 'Taglist generator procedures
  492. '
  493. Procedure _COMPILE[A$]
  494.    Shared A1
  495.    
  496.    'Compiles a TAG_LIST in a string, which may contain tag-equates
  497.    '& literal strings, and subnto a relocatable taglist string  
  498.    '
  499.    A1=0 : OFF$="" : TAG$="" : ST$=""
  500.    
  501.    Repeat 
  502.       A=A1
  503.       Exit If A=Len(A$)
  504.       A1= Extension_16_00BC(A$,",",A) : If A1=0 : A1=Len(A$)+1 : End If 
  505.       EL$=Mid$(A$,A+1,A1-A-1)
  506.       
  507.       If(EL$="")
  508.          Print "Syntax error at position";A1+1
  509.          _MUI_CLOSE
  510.          End 
  511.          
  512.       Else If Asc(EL$)=39
  513.          'Quoted string 
  514.          '
  515.          _GET_STRING[A$,A] : EL$=Param$
  516.          
  517.          'Store formatted string
  518.          '
  519.          OFF$=OFF$+ Extension_16_04EA(Len(TAG$))+ Extension_16_04EA(Len(ST$))+ Extension_16_04EA(Len(EL$))
  520.          TAG$=TAG$+ Extension_16_04CE(0)
  521.          ST$=ST$+EL$
  522.          
  523.          Inc A1
  524.       Else If Asc(EL$)=96
  525.          'Permanent String
  526.          '
  527.          
  528.          _GET_STRING[A$,A] : EL$=Param$
  529.          OFF$=OFF$+ Extension_16_04EA(Len(TAG$))+ Extension_16_04EA(Len(ST$))+ Extension_16_04EA(-Len(EL$))
  530.          TAG$=TAG$+ Extension_16_04CE(0)
  531.          
  532.          ST$=ST$+EL$
  533.          Inc A1
  534.       Else If Asc(EL$)=40
  535.          TAG$=TAG$+Mid$(A$,A+2,4)
  536.          A1=A+7
  537.       Else 
  538.          'Numeric or Tag Equate value 
  539.  
  540.          V=Val(EL$)
  541.          If Str$(V)-" "<>EL$-" "
  542.             If Hex$(V)<>EL$-" "
  543.                _MATCH[EL$] : V=Param
  544.             Else 
  545.                TAG$=TAG$+ Extension_16_04CE(V)
  546.             End If 
  547.          End If 
  548.          TAG$=TAG$+ Extension_16_04CE(V)
  549.       End If 
  550.    Until A1>Len(A$)
  551.    '
  552. End Proc[ Extension_16_04EA(Len(TAG$))+ Extension_16_04EA(Len(TAG$)+Len(ST$))+TAG$+ST$+OFF$+ Extension_16_04CE($80000000)]
  553. Procedure _MATCH[TAG$]
  554.    If TAG$="TAG_DONE"
  555.       RES=0
  556.    Else 
  557.       TREE=0
  558.       NODE$= Extension_16_0282(Start(13)+TREE+10,Deek(Start(13)+TREE+8))
  559.       
  560.       While NODE$<>TAG$
  561.          If NODE$>TAG$
  562.             TREE=Deek(Start(13)+TREE)
  563.          Else 
  564.             TREE=Deek(Start(13)+TREE+2)
  565.          End If 
  566.          If TREE<>0
  567.             NODE$= Extension_16_0282(Start(13)+TREE+10,Deek(Start(13)+TREE+8))
  568.          Else 
  569.             Print "Unknown tag ";TAG$;""
  570.             _MUI_CLOSE : End 
  571.          End If 
  572.       Wend 
  573.       RES=Leek(Start(13)+TREE+4)
  574.    End If 
  575. End Proc[RES]
  576. Procedure _STORE[S$]
  577.    Shared MUI_WORK_PTR
  578.    
  579.    S$=S$+Chr$(0)
  580.    If Len(S$) mod 2
  581.       S$=S$+Chr$(0)
  582.    End If 
  583.    
  584.    If MUI_WORK_PTR+Len(S$)>Length(17)
  585.       Print "MUI Workspace Overflow"
  586.       _MUI_CLOSE : End 
  587.    End If 
  588.    
  589.    _ADDR=Start(17)+MUI_WORK_PTR
  590.     Extension_16_02BE _ADDR,S$
  591.    Add MUI_WORK_PTR,Len(S$)
  592.    
  593. End Proc[_ADDR]
  594.  
  595. 'Private procedures
  596. '
  597. Procedure _GET_STRING[A$,A]
  598.    Shared A1
  599.    A1=A+1
  600.    Repeat 
  601.       A1= Extension_16_009E(A$,39,A1) : Exit If A1=0
  602.    Until Asc(Mid$(A$,A1-1,1))<>92
  603.    If A1=0
  604.       Print "Unmatched Quote at position ";A+1
  605.       _MUI_CLOSE : End 
  606.    End If 
  607.    EL$=Mid$(A$,A+2,A1-A-2)
  608.    
  609.    'Substitute formatting codes 
  610.    '
  611.    _FORMAT[EL$]
  612. End Proc[Param$]
  613. Procedure _FORMAT[EL$]
  614.    X= Extension_16_008C(EL$,92)
  615.    While X
  616.       Y=Asc(Mid$(EL$,X+1))
  617.       If Y=97
  618.          R$="'"
  619.       Else If Y=98
  620.          R$="`"
  621.       Else If Y=92
  622.          R$="\"
  623.       Else If Y=113
  624.          R$='"'
  625.       Else If Y=101
  626.          R$=Chr$(27)
  627.       Else If Y=116
  628.          R$=Chr$(9)
  629.       End If 
  630.       EL$=Left$(EL$,X-1)+R$+Mid$(EL$,X+2)
  631.       X= Extension_16_009E(EL$,92,X)
  632.    Wend 
  633.    
  634.    'Pad string to even length & Null terminate
  635.    '
  636.    EL$=EL$+Chr$(0)
  637.    If Len(EL$) mod 2
  638.       EL$=EL$+Chr$(0)
  639.    End If 
  640. End Proc[EL$]
  641. Procedure _INSTALL[TAG$]
  642.    'Takes a relocatable taglist string from compile, and returns a version
  643.    'usable in MUI Tag list calls, with all literal strings permanently stored 
  644.    'in the MUI workspace. 
  645.    '
  646.    Shared MUI_WORK_PTR
  647.  
  648.    'If the taglist doesn't end with $80000000, it has already been ignored
  649.    'so don't re-install it. 
  650.    '
  651.    If Extension_16_04DC(Right$(TAG$,4))=$80000000
  652.    MUI_TEMP_PTR=0
  653.    OFF=Deek(Varptr(TAG$)+2)+4
  654.    ST=Deek(Varptr(TAG$))+4
  655.    While OFF<Len(TAG$)-4
  656.       O=Deek(Varptr(TAG$)+OFF) : Add OFF,2
  657.       S=Deek(Varptr(TAG$)+OFF) : Add OFF,2
  658.       SL= Extension_16_035A(Deek(Varptr(TAG$)+OFF)) : Add OFF,2
  659.       P=Sgn(SL)
  660.       If P=-1
  661.          SL=-SL
  662.          B=17 : A=MUI_WORK_PTR
  663.          Add MUI_WORK_PTR,SL
  664.       Else 
  665.          B=18 : A=MUI_TEMP_PTR
  666.          Add MUI_TEMP_PTR,SL
  667.       End If 
  668.       
  669.       If A+SL>Length(B)
  670.          Print "MUI Workspace / Tempspace overflow"
  671.          _MUI_CLOSE : End 
  672.       End If 
  673.       
  674.       Loke Varptr(TAG$)+4+O,Start(B)+A
  675.       Copy Varptr(TAG$)+ST+S,Varptr(TAG$)+ST+S+SL To Start(B)+A
  676.    Wend 
  677.    TAG$=Mid$(TAG$,5,Deek(Varptr(TAG$)))
  678.    End If 
  679. End Proc[TAG$]
  680.  
  681. 'MUI Control Procedures
  682. '    
  683. Procedure _MUI_NEW_OBJECT[NAME$,TAG_LIST$]
  684.    Shared _DEBUG
  685.    'Creates an MUI object from the given installed tag bank 
  686.    '
  687.    _INSTALL[TAG_LIST$] : TAG_LIST$=Param$
  688.    
  689.    If _DEBUG=1 Then Pop Proc[0]
  690.    
  691.    NAME$=NAME$+Chr$(0)
  692.    Areg(0)=Varptr(NAME$)
  693.    If TAG_LIST$<>""
  694.       Areg(1)=Varptr(TAG_LIST$)
  695.    Else 
  696.       Areg(1)=0
  697.    End If 
  698. End Proc[Lib Call(2,-$1E)]
  699. Procedure _MUI_DISPOSE_OBJECT[OBJ]
  700.    'Disposes of an MUI Object & All of its child objects. 
  701.    '
  702.    If OBJ
  703.       Areg(0)=OBJ
  704.       NULL=Lib Call(2,-$24)
  705.    End If 
  706. End Proc
  707. Procedure _MUI_SET_ATTRS[OBJ,TAG$,V]
  708.    'Sets an MUI Objects attributes (Actually works for any BOOPSI object) 
  709.    '
  710.    _MATCH[TAG$]
  711.    TAG_LIST$= Extension_16_04CE(Param)+ Extension_16_04CE(V)+ Extension_16_04CE(0)
  712.    If OBJ
  713.       Areg(0)=OBJ
  714.       Areg(1)=Varptr(TAG_LIST$)
  715.       NULL=Intcall(-648) : Rem SetAttrsA  
  716.    End If 
  717. End Proc
  718. Procedure _MUI_GET_ATTR[OBJ,TAG$]
  719.    'Gets an MUI Objects attributes (Actually works for any BOOPSI object) 
  720.    'ONLY use for BOOLEAN/BYTE/INT/LONG attributes - NOT strings!
  721.    
  722.    _MATCH[TAG$] : TAG=Param
  723.    V=0
  724.    If OBJ
  725.       Dreg(0)=TAG
  726.       Areg(0)=OBJ
  727.       Areg(1)=Varptr(V)
  728.       NULL=Intcall(-654) : Rem GetAttr  
  729.    End If 
  730. End Proc[V]
  731. Procedure _MUI_GET_STRING_ATTR[OBJ,TAG$]
  732.    'Gets a COPY of an MUI Objects string attribute.   
  733.    '
  734.    _MUI_GET_ATTR[OBJ,TAG$]
  735.    
  736. End Proc[ Extension_16_0292(Param,65534,0)]
  737.  
  738. Procedure _MUI_DO_METHOD[OBJ,TAG_LIST$]
  739.    'A version of do_methodA hacked from amiga.lib via an E-Module!
  740.    '
  741.    If OBJ
  742.       _INSTALL[TAG_LIST$]
  743.       TAG_LIST$=Param$
  744.       Areg(2)=OBJ
  745.       Areg(0)=Leek(OBJ-4)
  746.       Areg(3)=Leek(Leek(OBJ-4)+8)
  747.       Areg(1)=Varptr(TAG_LIST$)
  748.       Call Leek(Leek(OBJ-4)+8)
  749.    End If 
  750.    '
  751. End Proc[Dreg(0)]
  752. Procedure _MUI_MAIN_LOOP[APP_OBJ]
  753.    '
  754.    'This is the standard MUI wait for user input loop. This loop will 
  755.    'terminate when the user quits the application by any valid quit 
  756.    'method. 
  757.    '
  758.    'Whenever an MUIM_Application_ReturnID event occurs, the procedure 
  759.    '_USER_RETURN_ID is called with the ID returned. You should write  
  760.    'this procedure to act on the ID's 
  761.    '
  762.    SIGNAL=0
  763.    Do 
  764.       
  765.       'Do method application input & store MUI's signal bits in SIGNAL 
  766.       
  767.       TAGLIST$= Extension_16_04CE($8042D0F5)+ Extension_16_04CE(Varptr(SIGNAL))
  768.       Areg(2)=APP_OBJ
  769.       Areg(0)=Leek(APP_OBJ-4)
  770.       Areg(3)=Leek(Leek(APP_OBJ-4)+8)
  771.       Areg(1)=Varptr(TAGLIST$)
  772.       Call Leek(Leek(APP_OBJ-4)+8)
  773.       '
  774.       RES=Dreg(0)
  775.       If RES=-1
  776.          SIGNAL=0
  777.          _IS_ASL_OPEN
  778.          Exit If Param=0
  779.       End If 
  780.       
  781.       _USER_RETURN_ID[RES]
  782.       
  783.       '
  784.       If SIGNAL<>0
  785.          Dreg(0)=SIGNAL
  786.          SIGNAL=Execall(-318) : Rem wait on signal       
  787.       End If 
  788.    Loop 
  789. End Proc
  790. Procedure _MUI_REQUEST[APP_OBJ,WIN_OBJ,TITLE$,TEX$,BUT$]
  791.    'Pops up an MUI requester, centered on the window, if not NULL, with 
  792.    'the title, TITLE$ unless it is null, in which case the application
  793.    'title is used. BUT$=" *_OK | _Save | _Cancel" etc. * = Default reply
  794.    '_ before a character sets the keyboard shortcut.
  795.    'TEX is the requester text.
  796.    
  797.    'Returns number of button pressed. Numbers are from 1 upwards, but 
  798.    'rightmost button is always 0. 
  799.    '
  800.    
  801.    _FORMAT[TEX$] : TEX$=Param$
  802.    F=Free
  803.    Dreg(0)=APP_OBJ
  804.    Dreg(1)=WIN_OBJ
  805.    Dreg(2)=0
  806.    If TITLE$="" Then Areg(0)=0 : Else Areg(0)=Varptr(TITLE$)
  807.    If TEX$="" Then Areg(2)=0 : Else Areg(2)=Varptr(TEX$)
  808.    If BUT$="" Then Areg(1)=0 : Else Areg(1)=Varptr(BUT$)
  809.    Areg(3)=0
  810. End Proc[Lib Call(2,-$2A)]
  811.  
  812. Procedure _MUI_INIT[WORKSPACE,TEMPSPACE]
  813.    Shared MUI_WORK_PTR
  814.    Lib Open 2,"muimaster.library",8
  815.    Reserve As Work 17,WORKSPACE
  816.    Reserve As Work 18,TEMPSPACE
  817.    MUI_WORK_PTR=0
  818.    Lib Open 3,"intuition.library",0
  819.       Loke Start(14)+28, Extension_16_04C0(0) : Rem Store AMOS A5
  820.       Loke Start(14)+32,Lib Base(3) : Rem Store Intuition Base 
  821.       Loke Start(14)+36,Lib Base(2) : Rem Store MUIMaster Base 
  822.    Lib Close 3
  823. End Proc
  824. Procedure _MUI_CLOSE
  825.    Shared APP_OBJ
  826.    If APP_OBJ
  827.       _MUI_DISPOSE_OBJECT[APP_OBJ]
  828.       APP_OBJ=0
  829.    End If 
  830.    Lib Close 2
  831.    Erase 17
  832.    Erase 18
  833.    Amos Unlock 
  834.    Amos To Front 
  835. End Proc
  836. Procedure _MUI_INSTALL_HOOK[ADR,D]
  837.    'Installs a hook to a assembler subroutine at address ADR. You should
  838.    'use an address in an AMOS bank - Ploadded banks are best. 
  839.    'You are returned the address of the hook structure which you should put 
  840.    'in the taglist which requies the hook. D a pointer to the data area 
  841.    'associated with this instance of the hook. If you want several hook 
  842.    'instances to share data, pass them the same value of D. If your hook
  843.    'requies no data, pass D=0 
  844.    '
  845.    'NOTE: Each hook structure returned by this function should be used in 
  846.    '      a taglist only once. You can have many hooks to the same ADR. 
  847.    '  
  848.    'NOTE: MUI deallocates the hook structure's memory when parsing the
  849.    '      taglist.
  850.    '
  851.    'For details on programming hooks, see the file Hook.s 
  852.    '
  853.    '
  854.    Dreg(0)=24
  855.    Dreg(1)=0
  856.    HOOK=Execall(-198) : Rem _LVOAllocMem 
  857.  
  858.    If HOOK=0
  859.       Print "Failed to allocated hook memory"
  860.       _MUI_CLOSE
  861.       End 
  862.    End If 
  863.  
  864.    Loke HOOK+8,Start(14)
  865.    Loke HOOK+12,ADR
  866.    Loke HOOK+16,D
  867.    
  868. End Proc[HOOK]
  869.  
  870.  
  871. 'MUI Builtin Object Creators / Macro creation procedures 
  872. '======================================================= 
  873.  
  874. 'Buttons 
  875. '
  876. Procedure _MUIB_BUTTON[LABEL$]
  877.    'Create a simple button object 
  878.    '
  879.    Dreg(0)=2 : Rem Button Object
  880.    _STORE[LABEL$] : A=Param
  881.    Areg(0)=Varptr(A)
  882. End Proc[Lib Call(2,-120)]
  883. Procedure _MUIB_KEYBUTTON[LABEL$,HOTKEY$]
  884.    HOTKEY$=Str$(Asc(HOTKEY$))-" "
  885.    _COMPILE["MUIA_Frame,MUIV_FrameButton,MUIA_Text_Contents,'\ec"+LABEL$+"',MUIA_Text_HiChar,"+HOTKEY$+",MUIA_ControlChar,"+HOTKEY$+",MUIA_InputMode,MUIV_InputModeRelVerify,MUIA_Background,MUII_ButtonBack,0"]
  886.    _MUI_NEW_OBJECT["Text.mui",Param$]
  887. End Proc[Param]
  888. Procedure _MUIB_POPBUTTON[IMAGE]
  889.    Dreg(0)=8
  890.    Areg(0)=Varptr(IMAGE)
  891. End Proc[Lib Call(2,-120)]
  892. Procedure _MUIB_CHECKMARK[LABEL$,HOTKEY$,SELECTED]
  893.    A$="MUIA_InputMode,MUIV_InputModeToggle,"
  894.    A$=A$+"MUIA_Image_Spec,MUII_CheckMark,"
  895.    A$=A$+"MUIA_Image_FreeVert,1,"
  896.    A$=A$+"MUIA_Selected,("+ Extension_16_04CE(SELECTED)+"),"
  897.    A$=A$+"MUIA_Background,MUII_ButtonBack,"
  898.    A$=A$+"MUIA_ControlChar,("+ Extension_16_04CE(Asc(HOTKEY$))+"),"
  899.    A$=A$+"MUIA_Frame,MUIV_FrameImageButton,"
  900.    A$=A$+"MUIA_ShowSelState,0,TAG_DONE"
  901.    _COMPILE[A$]
  902.    _MUI_NEW_OBJECT['Image.mui',Param$]
  903.    _MUIB_LABELOBJ["\el"+LABEL$,HOTKEY$,Param,True]
  904. End Proc[Param]
  905.  
  906. 'Labels
  907. '
  908. Procedure _MUIB_LABEL[LABEL$]
  909.    Dreg(0)=1 : Rem Label Object 
  910.    A$=String$(Chr$(0),8)
  911.    Loke Varptr(A$),Varptr(LABEL$)
  912.    Areg(0)=Varptr(A$)
  913. End Proc[Lib Call(2,-120)]
  914. Procedure _MUIB_TITLE_LABEL[LABEL$]
  915.    _COMPILE["MUIA_Background,MUII_FILL,MUIA_Text_Contents,'\ec"+LABEL$+"',MUIA_Frame,MUIV_FrameGroup,TAG_DONE"]
  916.    _MUI_NEW_OBJECT["Text.mui",Param$]
  917. End Proc[Param]
  918. Procedure _MUIB_LABELOBJ[LABEL$,HOTKEY$,OBJ,RIGHT]
  919.    'Adds a label to the left of the object. The hotkey is the 
  920.    'objects hotkey, which is underlined if it appears in the label. 
  921.    '
  922.    'RIGHT=0 if label is fixed width on left of object (E.g. Strings)
  923.    'RIGHT=-1 if object is fixed/var width on left of var width label. 
  924.  
  925.    'Add Label...
  926.  
  927.    _COMPILE["MUIA_Text_Contents,'\ec"+LABEL$+"',MUIA_Text_HiChar,"+Str$(Asc(HOTKEY$))-" "+",MUIA_Text_SetMax,("+ Extension_16_04CE(RIGHT+1)+"),TAG_DONE"]
  928.    _MUI_NEW_OBJECT["Text.mui",Param$] : LBOBJ=Param
  929.    If RIGHT
  930.       _MUIB_GROUP[ Extension_16_04CE(OBJ)+ Extension_16_04CE(LBOBJ),1,0]
  931.    Else 
  932.       _MUIB_GROUP[ Extension_16_04CE(LBOBJ)+ Extension_16_04CE(OBJ),1,0]
  933.    End If 
  934. End Proc[Param]
  935.  
  936. 'Strings 
  937. '
  938. Procedure _MUIB_KEYSTRING[S$,MXLEN,HOTKEY$]
  939.    'NOTE: MXLEN is the real maximum length of the string, in terms of AMOS
  940.    '      strings - don't add 1 for the terminating chr$(0) added by MUI. 
  941.    
  942.    Dreg(0)=7 : Rem String Object
  943.    HOTKEY$=Str$(Asc(HOTKEY$))-" "
  944.    S$=Left$(S$,MXLEN)+String$(Chr$(0),Max(0,MXLEN-Len(S$)))+Chr$(0)
  945.    _STORE[S$]
  946.    A$="MUIA_Frame,MUIV_FrameString,"
  947.    A$=A$+"MUIA_String_Contents,("+ Extension_16_04CE(Param)+"),"
  948.    A$=A$+"MUIA_String_MaxLen,("+ Extension_16_04CE(MXLEN+1)+"),"
  949.    A$=A$+"MUIA_ControlChar,"+HOTKEY$+",TAG_DONE"
  950.    _COMPILE[A$]
  951.    _MUI_NEW_OBJECT["String.mui",Param$]
  952. End Proc[Param]
  953. Procedure _MUIB_LABSTRING[S$,MXLEN,HOTKEY$,LABEL$]
  954.    'Even though this is a group object, you can still communicate 
  955.    'with it as if it were a simple string object, as MUI objects pass 
  956.    'unrecognised attributes down to their children. 
  957.    
  958.    _MUIB_KEYSTRING[S$,MXLEN,HOTKEY$]
  959.    _MUIB_LABELOBJ[LABEL$,HOTKEY$,Param,False]
  960. End Proc[Param]
  961. Procedure _MUIB_FILESTRING[LABEL$,HOTKEY$,INIT_FILE$,TITLE$]
  962.    'Create a string gadget with a button that pops up an ASL file requester.
  963.    'When the button is pressed, the string is changed to the selected file. 
  964.    '
  965.    'Use notification on MUIM_String_Acknowledge to detect when the string 
  966.    'changes.
  967.    
  968.    _MUIB_LABSTRING[INIT_FILE$,256,HOTKEY$,LABEL$] : SOBJ=Param
  969.    
  970.    _MATCH["MUII_PopFile"]
  971.    _MUIB_POPBUTTON[Param] : BTOBJ=Param
  972.    
  973.    A$="MUIA_Popstring_String,("+ Extension_16_04CE(SOBJ)+"),"
  974.    A$=A$+"MUIA_Popstring_Button,("+ Extension_16_04CE(BTOBJ)+"),"
  975.    A$=A$+"ASLFR_TITLETEXT,'"+TITLE$+"',TAG_DONE"
  976.    _COMPILE[A$]
  977.    _MUI_NEW_OBJECT["Popasl.mui",Param$]
  978. End Proc
  979. Procedure _MUIB_LISTSTRING[S$,MXLEN,HOTKEY$,LABEL$,LOBJ]
  980.    'Parameters as _MUIB_LABSTRING, and LOBJ is a listview object -  
  981.    'You can use those created by _MUIB_LISTVIEW 
  982.    '
  983.    _MUIB_KEYSTRING[S$,MXLEN,HOTKEY$] : SOBJ=Param
  984.    
  985.    'Get Intuition base for Get/Set Attr calls 
  986.    '
  987.    _MUI_INSTALL_HOOK[Start(32),0] : OSHOOK=Param
  988.    _MUI_INSTALL_HOOK[Start(32)+4,0] : SOHOOK=Param
  989.    
  990.    _MATCH["MUII_PopUp"]
  991.    _MUIB_POPBUTTON[Param] : BTOBJ=Param
  992.    A$="MUIA_Popstring_Button,("+ Extension_16_04CE(BTOBJ)+"),"
  993.    A$=A$+"MUIA_Popstring_String,("+ Extension_16_04CE(SOBJ)+"),"
  994.    A$=A$+"MUIA_Popobject_StrObjHook,("+ Extension_16_04CE(SOHOOK)+"),"
  995.    A$=A$+"MUIA_Popobject_ObjStrHook,("+ Extension_16_04CE(OSHOOK)+"),"
  996.    A$=A$+"MUIA_Popobject_Object,("+ Extension_16_04CE(LOBJ)+"),"
  997.    A$=A$+"TAG_DONE"
  998.    '
  999.    _COMPILE[A$]
  1000.    _MUI_NEW_OBJECT['Popobject.mui',Param$] : POBJ=Param
  1001.    _COMPILE["MUIM_Notify,MUIA_Listview_DoubleClick,1,("+ Extension_16_04CE(POBJ)+"),2,MUIM_Popstring_Close,1"]
  1002.    _MUI_DO_METHOD[LOBJ,Param$]
  1003.  
  1004.    _MUIB_LABELOBJ[LABEL$,HOTKEY$,POBJ,False]
  1005. End Proc[Param]
  1006.  
  1007. 'Others
  1008. '
  1009. Procedure _MUIB_CYCLE[LIST$]
  1010.    'Takes a list of labels for the cycle gadget, seperated by |'s. Labels 
  1011.    'may contain usual formatting codes. 
  1012.    
  1013.    OSEP=0 : PTR$=""
  1014.    Repeat 
  1015.       SEP= Extension_16_009E(LIST$,124,OSEP) : If SEP=0 : SEP=Len(LIST$)+1 : End If 
  1016.       _FORMAT[Mid$(LIST$,OSEP+1,SEP-OSEP-1)]
  1017.       _STORE[Param$] : PTR$=PTR$+ Extension_16_04CE(Param)
  1018.       OSEP=SEP
  1019.    Until SEP>Len(LIST$)
  1020.    
  1021.    'Now PTR$ is an array of pointers to the labels
  1022.    _STORE[PTR$+ Extension_16_04CE(0)] : PTR=Param
  1023.    _COMPILE["MUIA_Cycle_Entries,("+ Extension_16_04CE(Param)+"),TAG_DONE"]
  1024.    _MUI_NEW_OBJECT['Cycle.mui',Param$]
  1025. End Proc[Param]
  1026. Procedure _MUIB_LISTVIEW[LIST$]
  1027.    'Create a listview from a string seperated with |'s. 
  1028.    '
  1029.    _COMPILE["MUIA_Frame,MUIV_FrameInputList,TAG_DONE"]
  1030.    _MUI_NEW_OBJECT['List.mui',Param$] : LOBJ=Param
  1031.    OSEP=0 : PTR$=""
  1032.    Repeat 
  1033.       SEP= Extension_16_009E(LIST$,124,OSEP) : If SEP=0 : SEP=Len(LIST$)+1 : End If 
  1034.       _FORMAT[Mid$(LIST$,OSEP+1,SEP-OSEP-1)]
  1035.       _STORE[Param$]
  1036.       _COMPILE["MUIM_List_InsertSingle,("+ Extension_16_04CE(Param)+"),MUIV_List_Insert_Bottom"]
  1037.       _MUI_DO_METHOD[LOBJ,Param$]
  1038.       OSEP=SEP
  1039.    Until SEP>Len(LIST$)
  1040.    
  1041.    '
  1042.    _COMPILE["MUIA_Listview_List,("+ Extension_16_04CE(LOBJ)+"),TAG_DONE"]
  1043.    _MUI_NEW_OBJECT['Listview.mui',Param$]
  1044. End Proc[Param]
  1045. Procedure _MUIB_BITMAP_BOB[_BOB,FRAME$]
  1046.    'This procedure converts an AMOS Sprite bank image into an MUI bitmap
  1047.    'object. _BOB is the image to convert. FRAME$ is an MUIV_Frame...
  1048.    'tag to describe which frame to put around the image.
  1049.    '
  1050.    'NOTE: To not delete the sprite image while the MUI object is in use.
  1051.    '
  1052.    'NOTE: The image colours are remapped to the pens on the MUI objects 
  1053.    '      screen which match the sprite palette closest.  
  1054.  
  1055.  
  1056.  
  1057.    'Compute Frame Tagvalue  
  1058.    '
  1059.    _MATCH[FRAME$] : FRAME=Param
  1060.  
  1061.  
  1062.  
  1063.    'Create a graphics library bitmap structure for the chosen bob image.
  1064.    '
  1065.    SB=Sprite Base(_BOB)
  1066.    X=Deek(SB) : Y=Deek(SB+2) : D=Deek(SB+4)
  1067.    PLN=SB+10
  1068.    '
  1069.    BITMAP$= Extension_16_04EA(X*2)+ Extension_16_04EA(Y)+ Extension_16_04EA(D)+ Extension_16_04EA(0)
  1070.    For A=1 To 8
  1071.       If A<=D
  1072.          BITMAP$=BITMAP$+ Extension_16_04CE(PLN)
  1073.          Add PLN,X*2*Y
  1074.       Else 
  1075.          BITMAP$=BITMAP$+ Extension_16_04CE(0)
  1076.       End If 
  1077.    Next 
  1078.    '
  1079.    _STORE[BITMAP$] : BM=Param
  1080.  
  1081.  
  1082.  
  1083.    'Create a 24 representation of the sprite palette for MUI to remap 
  1084.    '
  1085.  
  1086.    NC=0 : Bset D,NC
  1087.  
  1088.    SP=Start(1)+Deek(Start(1))*8+2 : SP$=""
  1089.    For A=0 To NC-1
  1090.       CL=Deek(SP+A*2)
  1091.  
  1092.       R=(CL/$100)*$1111
  1093.       G=((CL/$10) and $F)*$1111
  1094.       B=(CL and $F)*$1111
  1095.  
  1096.       SP$=SP$+ Extension_16_04EA(R)+ Extension_16_04EA(R)+ Extension_16_04EA(G)+ Extension_16_04EA(G)+ Extension_16_04EA(B)+ Extension_16_04EA(B)
  1097.    Next 
  1098.    '  
  1099.    _STORE[SP$] : PAL=Param
  1100.  
  1101.  
  1102.    'Create the bitmap object
  1103.    '
  1104.  
  1105.    A$="MUIA_Bitmap_Bitmap,("+ Extension_16_04CE(BM)+"),"
  1106.    A$=A$+"MUIA_Bitmap_Width,("+ Extension_16_04CE(X*16)+"),"
  1107.    A$=A$+"MUIA_Bitmap_Height,("+ Extension_16_04CE(Y)+"),"
  1108.    A$=A$+"MUIA_FixWidth,("+ Extension_16_04CE(X*16)+"),"
  1109.    A$=A$+"MUIA_FixHeight,("+ Extension_16_04CE(Y)+"),"
  1110.    A$=A$+"MUIA_Bitmap_SourceColors,("+ Extension_16_04CE(PAL)+"),"
  1111.    A$=A$+"MUIA_Frame,("+ Extension_16_04CE(FRAME)+"),"
  1112.    A$=A$+"TAG_DONE"
  1113.  
  1114.    _COMPILE[A$]
  1115.    _MUI_NEW_OBJECT['Bitmap.mui',Param$]
  1116. End Proc[Param]
  1117.  
  1118. 'Groups
  1119.  
  1120. Procedure _MUIB_SIZEABLE[OBJ,HORIZ]
  1121.    'This procedure puts the object in a horizontal group
  1122.    'with 2 empty rectanges, which effecively makes a fixwidth object  
  1123.    'resizeable. Usefull for _MUIB_BITMAP_BOB's which otherwise stop 
  1124.    'your window from being horizontally resized.
  1125.    '
  1126.    'If HORIZ is true, the object is made horizontally sizeable
  1127.    'If HORIZ is false, the object is made vertically sizeable 
  1128.    '
  1129.    'To make the object 2-way sizable, call this procedure twice.
  1130.    '
  1131.    'NOTE: The objects are given minimal weight so they are only 
  1132.    '      expanded is little as possible to allow the window to 
  1133.    '      resize, and anything else that is expandable will expand
  1134.    '      much more.
  1135.    '
  1136.    _MUI_NEW_OBJECT['Rectangle.mui',"MUIA_Weight,1,0"] : R1=Param
  1137.    _MUI_NEW_OBJECT['Rectangle.mui',"MUIA_Weight,1,0"] : R2=Param
  1138.    A$="MUIA_Group_Horiz,("+ Extension_16_04CE(-HORIZ)+"),"
  1139.    A$=A$+"MUIA_Group_Child,("+ Extension_16_04CE(R1)+"),"
  1140.    A$=A$+"MUIA_Group_Child,("+ Extension_16_04CE(OBJ)+"),"
  1141.    A$=A$+"MUIA_Group_Child,("+ Extension_16_04CE(R2)+"),TAG_DONE"
  1142.    _COMPILE[A$]
  1143.    _MUI_NEW_OBJECT['Group.mui',Param$]
  1144. End Proc[Param]
  1145. Procedure _MUIB_GROUP[OBJ$,HORIZ,FRAME]
  1146.    '
  1147.    'Creates a group object. 
  1148.    '
  1149.    'OBJ$ is a string of longword$ specifing the child objects 
  1150.    '
  1151.    'HORIZ= 0/1  (1=Horizontal group)
  1152.    'FRAME= 0/1  (1=Make a group frame)
  1153.  
  1154.    _MATCH["MUIA_Group_Child"] : CH=Param
  1155.    TAG$=""
  1156.    For A=1 To Len(OBJ$)-3 Step 4
  1157.       TAG$=TAG$+ Extension_16_04CE(CH)+Mid$(OBJ$,A,4)
  1158.    Next 
  1159.  
  1160.    If HORIZ=1
  1161.       _MATCH["MUIA_Group_Horiz"]
  1162.       TAG$=TAG$+ Extension_16_04CE(Param)+ Extension_16_04CE(1)
  1163.    End If 
  1164.    If FRAME=1
  1165.       _MATCH["MUIA_Frame"]
  1166.       TAG$=TAG$+ Extension_16_04CE(Param)
  1167.       _MATCH["MUIV_FrameGroup"]
  1168.       TAG$=TAG$+ Extension_16_04CE(Param)
  1169.    End If 
  1170.    _MUI_NEW_OBJECT['Group.mui',TAG$+ Extension_16_04CE(0)]
  1171. End Proc[Param]
  1172.  
  1173. '****************************************************************************
  1174. 'These procedures require modification.  
  1175. '
  1176. Procedure _IS_ASL_OPEN
  1177.    
  1178.    Shared FILE_OBJ
  1179.    
  1180.    
  1181.    'This procedure is used to prevent your application from terminating 
  1182.    'while ASL requesters are still open.
  1183.    '
  1184.    'You should 'Or' _ASL_OPEN with the MUIA_Popasl_Active attribute   
  1185.    'or each of your PopAsl objects. 
  1186.    '
  1187.    
  1188.    _ASL_OPEN=False
  1189.    
  1190.    _MUI_GET_ATTR[FILE_OBJ,"MUIA_Popasl_Active"]
  1191.    _ASL_OPEN=_ASL_OPEN or Param
  1192.    
  1193.    
  1194.    
  1195. End Proc[_ASL_OPEN]
  1196. Procedure _USER_RETURN_ID[ID]
  1197.    'This procedure is called repeatedly when MUI is waiting for / receiving 
  1198.    'user input. ID values returned are those you specified in hook installs 
  1199.    'and MUIM_Application_ReturnID methods. There are also 2 built-in ID's:
  1200.    '
  1201.    '0 = No user input has occured. This procedure is called repeatedly with 
  1202.    '    0 when nothing is happening.
  1203.    '
  1204.    '-1 = This is MUI's quit signal. Normally if this ID is received,  
  1205.    '     this procedure is not called, and the MUI_mainloop terminates  
  1206.    '     returning to your main program, but if the user tries to quit
  1207.    '     while an ASL requester is open, the application can't quit, so 
  1208.    '     this procedure is called with parameter -1.
  1209.    '
  1210.    'NOTE: You should return from this procedure within .5 seconds of it being 
  1211.    '      called. If this is not possible, you should set the attribute 
  1212.    '      MUIA_Application_Sleep to True of your APP_OBJ during the delay,
  1213.    '      then set it to false again just before returning. 
  1214.    
  1215.    
  1216.    
  1217.    
  1218.    Shared FILE_OBJ,APP_OBJ,WIN_OBJ
  1219.    
  1220.    If ID=1
  1221.       Bell 
  1222.    Else If ID=2
  1223.       Shoot 
  1224.    Else If ID=3
  1225.       Boom 
  1226.    Else If ID=4
  1227.       _MUI_GET_STRING_ATTR[FILE_OBJ,"MUIA_String_Contents"]
  1228.       _MUI_REQUEST[APP_OBJ,WIN_OBJ,"MUI Requester","String Gadget Contains : "+Param$+".","* _Ok | _So What? "]
  1229.       
  1230.    Else If ID=-1
  1231.       _MUI_REQUEST[APP_OBJ,0,"MUI Requester","You cannot quit while ASL requesters are open","*  _Ok  "]
  1232.    End If 
  1233.    
  1234. End Proc
  1235.  
  1236. '
  1237. '
  1238. '****************************************************************************
  1239. 'The future
  1240. '==========
  1241. '
  1242. '
  1243. 'This file was thrown together over 3 days, and is only the second program 
  1244. 'I have tried to write using MUI, and as such it is more an exploration of 
  1245. 'MUI's features on my part, than anything else.
  1246. '
  1247. '
  1248. '
  1249. '
  1250. 'The allocation/deallocation of memory is not very advanced - I just store 
  1251. 'anything that needs keeping in a work bank, and forget about it. My eventual
  1252. 'aim is to create Easylife commands/functions to aid MUI use:
  1253. '
  1254. ' = Elmui New Object(TYPE$,TAG_LIST$)  
  1255. '
  1256. 'Which will take an AMOS taglist (I.E. As specified in the source), _COMPILE 
  1257. 'it, and _INSTALL it then create the object. But rather than putting the 
  1258. 'permanent strings in an AMOS work bank, this function would allocate some 
  1259. 'memory for permanent tag data, and store a pointer to it in MUIA_User_Data
  1260. 'of the allocated object. The initial 2 longwords of this memory area would
  1261. 'be left empty for the following:
  1262. '
  1263. '1st Longword. For Applications own use. (To replace _MUIA_User_Data)
  1264. '2nd Longword. Pointer to additional memory areas belonging to this object.
  1265. '
  1266. '
  1267. ' = Elmui Dispose Object(OBJ)
  1268. '
  1269. 'Which will dispose of the object, and of the MUI data areas pointed to
  1270. 'by its _MUIA_User_Data field. 
  1271. '
  1272. '
  1273. ' = Elmui Get Attrs(OBJ,TAG$)
  1274. '
  1275. 'Which will return the objects attribute specified in TAG$ 
  1276. '
  1277. '  
  1278. ' = Elmui Set Attrs(OBJ,TAG$,VALUE)
  1279. '
  1280. 'Which will set the attribute, then return the values it was actually
  1281. 'set to, so you tell if you succeeded (E.g. MUIA_Window_Open may fail) 
  1282. '
  1283. '
  1284. ' = Elmui Do Method(OBJ,TAG_LIST$) 
  1285. '
  1286. 'Which will do the method, but store any permanent data in the taglist 
  1287. 'in the memory allocated to ,and pointer to in a chain from longword #2
  1288. 'of the memory area in _MUIA_User_Data, so that disposing of the object
  1289. 'will also dispose of the data from the taglist. 
  1290. '
  1291. '
  1292. '
  1293. 'Each of the above funcitions would also have an equivilent which accepts
  1294. 'a true taglist. 
  1295. '
  1296. ' = Elmui Store(OBJ,ADDR,LENGTH) 
  1297. '
  1298. 'Which will store a COPY of the memory area in the chain of additonal
  1299. 'memory allocated to the object, for automatic disposal when the object
  1300. 'is killed.
  1301. '
  1302. '
  1303. 'I would also like the taglist parser to know which tags require permanent 
  1304. 'storage of their data, and which don't, and automatically allocated it
  1305. 'if the data is passed as a literal string in the taglist. This could be 
  1306. 'done quite easily by storing a boolean in BANK 13 with each tag. The only 
  1307. 'problem is knowing which tags need permanent storage. Any help in compiling 
  1308. 'a list would be greatly appreciated. (Just E-Mail me tagnames, and YES/NO)  
  1309. '
  1310. '
  1311. 'Something I an in the process of doing now, is to allow AMOS Procedures 
  1312. 'to be hook functions, so you don't have to write them in assembler, 
  1313. '(although it is worth doing so if you can, as they are much faster) 
  1314. '
  1315. '
  1316. 'If you would like to help develop an AMOS interface to MUI I would like the 
  1317. 'following:
  1318. '
  1319. '
  1320. ' - Any of the above function calls coded in assembler :-) 
  1321. '
  1322. ' - More assembler hook routines in banks for various purposes 
  1323. '   (Preferably with source).
  1324. '
  1325. ' - More MUIB object building procedures.
  1326. '
  1327. ' - Any useful MUI External classes you may happen to have.
  1328. '
  1329. ' - Example applications.
  1330. '
  1331. ' - Suggestions for other MUI Easylife Functions  /  AMOS Procedures.
  1332. '   (Or non-MUI easylife functions for that matter)
  1333. '
  1334. ' - Bug reports. 
  1335. '
  1336. '
  1337. '
  1338. '
  1339. 'Known Bugs
  1340. '==========
  1341. '
  1342. 'When you manually type an entry into a LISTSTRING (Such as Check: in the
  1343. 'demo), then popup the list, the list is searched for the string and the 
  1344. 'intial active/highlighted entry is set to it if it is found, otherwise
  1345. 'there is no highlighted entry.  The hook function finds the entry in the
  1346. 'list OK, but when it sets the lists the _MUIA_List_Active attribute, nothing
  1347. 'happens - the highlight doesn't move. A Prize for anyone who can find out 
  1348. 'why (See source Listview-Hooks.s) 
  1349. '